
import java.util.ArrayList;
import java.util.HashMap;

/**
 * Funciones que se declaran en el código.
 * @author paco
 */
public class SimboloFuncion extends Simbolo
{
	
	/**
	 * Nombre de la clase a la que pertenece el campo.
	 */
	private String clasePadre;
	
	private boolean hasReturn;
	
	private boolean constructor;
	
	private boolean visibilidad;
	
	private HashMap<String, Integer> argumentos;
	/**
	 * Constructor
	 * @param nombre Nombre del simbolo.
	 * @param tipo Tipo del simbolo.
	 */
	public SimboloFuncion(String nombre, Tipo tipo)
	{
		super(nombre, tipo);
		argumentos = new HashMap<String, Integer>();
		hasReturn = false;
		constructor = false;
		visibilidad = false;
	}

	@Override
	public boolean isVisible()
	{
		return visibilidad;
	}

	@Override
	public void setVisibilidad(boolean visibilidad)
	{
		this.visibilidad = visibilidad;
	}

	
	
	public String getClasePadre()
	{
		return clasePadre;
	}

	public void setClasePadre(String clasePadre)
	{
		this.clasePadre = clasePadre;
	}
	
	@SuppressWarnings("unchecked")
	public SimboloFuncion(String nombre, Tipo tipo, HashMap<String, Integer> argumentos)
	{
		super(nombre, tipo);
		this.argumentos = (HashMap<String, Integer>)argumentos.clone();
		hasReturn = false;
		constructor = false;
	}

	public HashMap<String, Integer> getArgs()
	{
		return argumentos;
	}

	public void setArgs(HashMap<String, Integer> argumentos)
	{
		this.argumentos = argumentos;
	}

	public boolean hasReturn()
	{
		return hasReturn;
	}

	public void setHasReturn(boolean hasReturn)
	{
		this.hasReturn = hasReturn;
	}
	
	
	
	/**
	 * Traducción del simbolo.
	 * @return traducción.
	 */
	@Override
	public String toString()
	{
		StringBuilder trad = new StringBuilder();
		trad.append(".method static public void ");
		trad.append(this.nombre);
		trad.append(" () cil managed\n");
		
		return trad.toString();
	}

	public boolean isConstructor()
	{
		return constructor;
	}

	public void setConstructor()
	{
		this.constructor = true;
	}
	
	
	
	/**
	 * Traducción del simbolo.
	 * @return traducción.
	 */
	@Override
	public String toString(String locals)
	{
		StringBuilder trad = new StringBuilder();
		
		trad.append(".method static public void ").append(this.nombre).append(" () cil managed\n{\n");
		trad.append("\t.entrypoint\n");
		trad.append("\t.maxstack 10000\n");
		if ( locals.length() != 0 )
		{
			trad.append("\t.locals(").append(locals).append(")\n");
		}
		
		return trad.toString();
	}
	
	public boolean hasArg(String name)
	{
		return argumentos.containsKey(name);
	}
	
	public String getArgsAsString()
	{
		StringBuilder sb = new StringBuilder();
		
		for ( int i = 0; i < argumentos.size(); i++ )
		{
			sb.append("float64");
			if ( i != argumentos.size() - 1 )
				sb.append(",");
		}
		
		return sb.toString();
	}
	
	/**
	 * Devuelve el .locals
	 * @return .locals
	 */
	@Override
	public String getLocals()
	{
		return "";
	}
	
	@Override
	public String toWrite()
	{
		if ( tipo != null )
			return this.tipo.toWrite();
		else
			return "void";
	}
}
